package lx.com.pdf;

import com.baidu.aip.speech.AipSpeech;
import com.baidu.aip.speech.TtsResponse;
import com.lx.entity.Var;
import com.lx.util.LX;

import java.io.File;
import java.io.FileOutputStream;
import java.util.HashMap;
import java.util.concurrent.Callable;
import java.util.concurrent.FutureTask;

/**
 * Created by 游林夕 on 2019/9/15.
 */
public class TextToVoiceUtil1 {
    public static void main1(String[]args){
        String s = "实现共义根本基础=社会生产力高度发展\n";
        char[] chars = s.toCharArray();
        for (char c : chars){
            byte[]a = createFile(String.valueOf(c));
            System.out.println(a.length);
        }
    }

    public static void main(String[]args) throws Exception {
        String str = "";
        str = str.replace("=",";1秒;;1秒;;1秒;;1秒;;1秒;;1秒;;1秒;;1秒;;1秒;").replace("\n",";1秒;");
        TextToVoiceUtil1.getInstance(str,new Var("{spd=4,pit=6,per=111}"));

    }
    public static final byte[] one = new byte[]{-1,-13,56,-60,0,17,-125,53,-24,0,1,89,121,-7,27,-5,-1,-112,-103,8,-95,-15,118,-95,9,-25,61,9,-50,32,66,16,-124,35,40,112,56,66,49,-50,-28,15,-117,-70,55,57,9,-13,-99,-107,8,76,-115,87,70,87,73,20,-17,83,-44,-102,54,70,35,33,39,121,-59,20,62,121,-35,-128,112,32,4,4,67,-56,78,-49,-42,-1,-21,-1,-1,-49,-1,-1,-1,-7,-94,102,-119,-105,-4,-61,-102,-128,-84,88,-58,-85,-1,-79,-2,-86,-1,-13,56,-60,25,19,35,61,-12,0,8,-45,-84,116,-65,-44,43,125,85,-116,-36,102,-2,-83,85,-6,-85,-82,-58,-91,13,114,-115,73,-115,117,38,-53,-1,113,-2,57,-18,50,-14,-40,-62,91,-118,-118,93,-86,-77,-54,-128,82,99,-96,-120,34,41,50,-77,86,-123,31,15,79,-1,-1,-1,-7,-111,-103,121,-111,-97,-52,-116,-53,-111,-111,-103,30,70,70,100,101,35,35,50,-39,44,114,63,-27,-122,76,-79,-49,-14,107,28,-1,35,-71,-75,-122,-1,-13,56,-60,43,13,-101,25,84,44,8,7,-87,77,97,-75,65,-60,-127,5,4,30,-81,-27,74,76,65,77,69,51,46,57,57,46,53,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-1,-13,56,-60,0,17,-125,53,-24,0,1,89,121,-7,27,-5,-1,-112,-103,8,-95,-15,118,-95,9,-25,61,9,-50,32,66,16,-124,35,40,112,56,66,49,-50,-28,15,-117,-70,55,57,9,-13,-99,-107,8,76,-115,87,70,87,73,20,-17,83,-44,-102,54,70,35,33,39,121,-59,20,62,121,-35,-128,112,32,4,4,67,-56,78,-49,-42,-1,-21,-1,-1,-49,-1,-1,-1,-7,-94,102,-119,-105,-4,-61,-102,-128,-84,88,-58,-85,-1,-79,-2,-86,-1,-13,56,-60,25,19,35,61,-12,0,8,-45,-84,116,-65,-44,43,125,85,-116,-36,102,-2,-83,85,-6,-85,-82,-58,-91,13,114,-115,73,-115,117,38,-53,-1,113,-2,57,-18,50,-14,-40,-62,91,-118,-118,93,-86,-77,-54,-128,82,99,-96,-120,34,41,50,-77,86,-123,31,15,79,-1,-1,-1,-7,-111,-103,121,-111,-97,-52,-116,-53,-111,-111,-103,30,70,70,100,101,35,35,50,-39,44,114,63,-27,-122,76,-79,-49,-14,107,28,-1,35,-71,-75,-122,-1,-13,56,-60,43,13,-101,25,84,44,8,7,-87,77,97,-75,65,-60,-127,5,4,30,-81,-27,74,76,65,77,69,51,46,57,57,46,53,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-1,-13,56,-60,0,17,-125,53,-24,0,1,89,121,-7,27,-5,-1,-112,-103,8,-95,-15,118,-95,9,-25,61,9,-50,32,66,16,-124,35,40,112,56,66,49,-50,-28,15,-117,-70,55,57,9,-13,-99,-107,8,76,-115,87,70,87,73,20,-17,83,-44,-102,54,70,35,33,39,121,-59,20,62,121,-35,-128,112,32,4,4,67,-56,78,-49,-42,-1,-21,-1,-1,-49,-1,-1,-1,-7,-94,102,-119,-105,-4,-61,-102,-128,-84,88,-58,-85,-1,-79,-2,-86,-1,-13,56,-60,25,19,35,61,-12,0,8,-45,-84,116,-65,-44,43,125,85,-116,-36,102,-2,-83,85,-6,-85,-82,-58,-91,13,114,-115,73,-115,117,38,-53,-1,113,-2,57,-18,50,-14,-40,-62,91,-118,-118,93,-86,-77,-54,-128,82,99,-96,-120,34,41,50,-77,86,-123,31,15,79,-1,-1,-1,-7,-111,-103,121,-111,-97,-52,-116,-53,-111,-111,-103,30,70,70,100,101,35,35,50,-39,44,114,63,-27,-122,76,-79,-49,-14,107,28,-1,35,-71,-75,-122,-1,-13,56,-60,43,13,-101,25,84,44,8,7,-87,77,97,-75,65,-60,-127,5,4,30,-81,-27,74,76,65,77,69,51,46,57,57,46,53,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-1,-13,56,-60,0,17,-125,53,-24,0,1,89,121,-7,27,-5,-1,-112,-103,8,-95,-15,118,-95,9,-25,61,9,-50,32,66,16,-124,35,40,112,56,66,49,-50,-28,15,-117,-70,55,57,9,-13,-99,-107,8,76,-115,87,70,87,73,20,-17,83,-44,-102,54,70,35,33,39,121,-59,20,62,121,-35,-128,112,32,4,4,67,-56,78,-49,-42,-1,-21,-1,-1,-49,-1,-1,-1,-7,-94,102,-119,-105,-4,-61,-102,-128,-84,88,-58,-85,-1,-79,-2,-86,-1,-13,56,-60,25,19,35,61,-12,0,8,-45,-84,116,-65,-44,43,125,85,-116,-36,102,-2,-83,85,-6,-85,-82,-58,-91,13,114,-115,73,-115,117,38,-53,-1,113,-2,57,-18,50,-14,-40,-62,91,-118,-118,93,-86,-77,-54,-128,82,99,-96,-120,34,41,50,-77,86,-123,31,15,79,-1,-1,-1,-7,-111,-103,121,-111,-97,-52,-116,-53,-111,-111,-103,30,70,70,100,101,35,35,50,-39,44,114,63,-27,-122,76,-79,-49,-14,107,28,-1,35,-71,-75,-122,-1,-13,56,-60,43,13,-101,25,84,44,8,7,-87,77,97,-75,65,-60,-127,5,4,30,-81,-27,74,76,65,77,69,51,46,57,57,46,53,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-1,-13,56,-60,0,17,-125,53,-24,0,1,89,121,-7,27,-5,-1,-112,-103,8,-95,-15,118,-95,9,-25,61,9,-50,32,66,16,-124,35,40,112,56,66,49,-50,-28,15,-117,-70,55,57,9,-13,-99,-107,8,76,-115,87,70,87,73,20,-17,83,-44,-102,54,70,35,33,39,121,-59,20,62,121,-35,-128,112,32,4,4,67,-56,78,-49,-42,-1,-21,-1,-1,-49,-1,-1,-1,-7,-94,102,-119,-105,-4,-61,-102,-128,-84,88,-58,-85,-1,-79,-2,-86,-1,-13,56,-60,25,19,35,61,-12,0,8,-45,-84,116,-65,-44,43,125,85,-116,-36,102,-2,-83,85,-6,-85,-82,-58,-91,13,114,-115,73,-115,117,38,-53,-1,113,-2,57,-18,50,-14,-40,-62,91,-118,-118,93,-86,-77,-54,-128,82,99,-96,-120,34,41,50,-77,86,-123,31,15,79,-1,-1,-1,-7,-111,-103,121,-111,-97,-52,-116,-53,-111,-111,-103,30,70,70,100,101,35,35,50,-39,44,114,63,-27,-122,76,-79,-49,-14,107,28,-1,35,-71,-75,-122,-1,-13,56,-60,43,13,-101,25,84,44,8,7,-87,77,97,-75,65,-60,-127,5,4,30,-81,-27,74,76,65,77,69,51,46,57,57,46,53,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86,-86};
    //设置APPID/AK/SK
    public static final String APP_ID = "17250121";
    public static final String API_KEY = "17bCraZ9nrV1hjCWv8b6gaM7";
    public static final String SECRET_KEY = "z4qQCRyZj3r51n6SgwLWwjwiHdaNCkmk";

    public static final String FILE_DIR = "D:\\testVoice\\";   //文件路径，待修改。
    private static HashMap<String, Object> options;

    static AipSpeech client = new AipSpeech(APP_ID, API_KEY, SECRET_KEY);
    private static final TextToVoiceUtil1 single = new TextToVoiceUtil1();
    //静态工厂方法
    //语速，取值0-9，默认为5中语速
    //音调，取值0-9，默认为5中语调
    //发音人选择, 0为女声，1为男声，3为情感合成-度逍遥，4为情感合成-度丫丫，默认为普通女 度博文=106，度小童=110，度小萌=111，度米朵=103，度小娇=5
    public static TextToVoiceUtil1 getInstance(String text, Var op) throws Exception {
        options = op;
        String fileName = LX.getDate("yyyyMMddHHmmss");
        File endFile =new File(FILE_DIR+fileName+"_end.mp3"); //最终文件
        File fileParent = endFile.getParentFile();
        if (fileParent != null &&!fileParent.exists())fileParent.mkdirs();
        FileOutputStream out = new FileOutputStream(endFile);
        out.write(new byte[1024]);
        String [] arr = text.split(";1秒;");
        for (String a : arr){
            out.write(add(a));
            out.write(one);
        }

        out.close();
        return single;
    }
    public static byte[] add(String text){
        byte[] byteDemo = new byte[0];
        if (LX.isEmpty(text)) return byteDemo;
        System.out.println(text);
        LX.sleep(200);
        //根据每500个字就划分出一个文件
        int singlePage = 1000;
        int articleLength = text.length();
        int number =articleLength%singlePage>0?articleLength/singlePage+1:articleLength/singlePage;  //记得这里是从1开始
        String[] singleArticle = new String[number]; //生成指定个数的String数组
        for (int i = 0; i < number; i++) {   //先不生成音频文件。先分组利用双线程来提高速度
            if (i == number - 1) { // 是否是最后一页
                singleArticle[i] = text.substring(i * singlePage, articleLength);
            } else {
                singleArticle[i] = text.substring(i * singlePage, i * singlePage + singlePage);
            }
        }
        for (int i = 0; i < number; i++) {
            byte[]by = createFile(singleArticle[i]);
            if (by != null){
                byteDemo = unitByteArray(byteDemo,by);// 获取分块的byte数据
            }
        }
        return byteDemo;
    }

    /*
     * 创建文字转语音的文件————>mp3格式
     * text:文本内容
     */
    public static byte[] createFile(String text){
        //分块生成录音文件
        TtsResponse res = client.synthesis(text, "zh", 1, options);
        byte[] data = res.getData();
        if (data != null) {
            return data;
        } else{
            LX.exMsg(res.getResult().toString());
            return null;
        }

    }
    /**
     * 合并byte数组
     */
    public static byte[] unitByteArray(byte[] byte1,byte[] byte2){
        byte[] unitByte = new byte[byte1.length + byte2.length];
        System.arraycopy(byte1, 0, unitByte, 0, byte1.length);
        System.arraycopy(byte2, 0, unitByte, byte1.length, byte2.length);
        return unitByte;
    }
}
